home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / mpeg_play-2.1 / video.h < prev   
C/C++ Source or Header  |  1995-05-09  |  14KB  |  371 lines

  1. /*
  2.  * Copyright (c) 1995 The Regents of the University of California.
  3.  * All rights reserved.
  4.  * 
  5.  * Permission to use, copy, modify, and distribute this software and its
  6.  * documentation for any purpose, without fee, and without written agreement is
  7.  * hereby granted, provided that the above copyright notice and the following
  8.  * two paragraphs appear in all copies of this software.
  9.  * 
  10.  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
  11.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  12.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
  13.  * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  14.  * 
  15.  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  16.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  17.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  18.  * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
  19.  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  20.  */
  21. #include <stdio.h>
  22. #include <setjmp.h>
  23.  
  24. #include <X11/Xlib.h>
  25. #include <X11/Xutil.h>
  26.  
  27. #ifdef SH_MEM
  28. #include <sys/ipc.h>
  29. #include <sys/shm.h>
  30. #include <X11/extensions/XShm.h>
  31. #endif
  32.  
  33. /* X11/xmd.h correctly defines INT32, etc */
  34. #ifndef XMD_H
  35. typedef int INT32;
  36. typedef short INT16;
  37. typedef char INT8;
  38. #endif
  39. typedef unsigned int UINT32;
  40. typedef unsigned short UINT16;
  41. typedef unsigned char UINT8;
  42.  
  43. /* Define Parsing error codes. */
  44.  
  45. #define SKIP_PICTURE (-10)
  46. #define SKIP_TO_START_CODE (-1)
  47. #define PARSE_OK 1
  48.  
  49. /* Define BOOLEAN, TRUE, and FALSE. */
  50.  
  51. #define BOOLEAN int
  52. #define TRUE 1
  53. #define FALSE 0
  54.  
  55. /* Set ring buffer size. */
  56.  
  57. #define RING_BUF_SIZE 5
  58.  
  59. /* Macros for picture code type. */
  60.  
  61. #define I_TYPE 1
  62. #define P_TYPE 2
  63. #define B_TYPE 3
  64. #define D_TYPE 4
  65.  
  66. /* Start codes. */
  67.  
  68. #define SEQ_END_CODE 0x000001b7
  69. #define SEQ_START_CODE 0x000001b3
  70. #define GOP_START_CODE 0x000001b8
  71. #define PICTURE_START_CODE 0x00000100
  72. #define SLICE_MIN_START_CODE 0x00000101
  73. #define SLICE_MAX_START_CODE 0x000001af
  74. #define EXT_START_CODE 0x000001b5
  75. #define USER_START_CODE 0x000001b2
  76.  
  77. /* Number of macroblocks to process in one call to mpegVidRsrc. */
  78.  
  79. #define MB_QUANTUM 100
  80.  
  81. /* Macros used with macroblock address decoding. */
  82.  
  83. #define MB_STUFFING 34
  84. #define MB_ESCAPE 35
  85.  
  86. /* Lock flags for pict images. */
  87.  
  88. #define DISPLAY_LOCK 0x01
  89. #define PAST_LOCK 0x02
  90. #define FUTURE_LOCK 0x04
  91.  
  92. #define HYBRID_DITHER 0
  93. #define HYBRID2_DITHER 1
  94. #define FS4_DITHER 2
  95. #define FS2_DITHER 3
  96. #define FS2FAST_DITHER 4
  97. #define Twox2_DITHER 5
  98. #define GRAY_DITHER 6
  99. #define FULL_COLOR_DITHER 7
  100. #define NO_DITHER 8
  101. #define ORDERED_DITHER 9
  102. #define MONO_DITHER 10
  103. #define MONO_THRESHOLD 11
  104. #define ORDERED2_DITHER 12
  105. #define MBORDERED_DITHER 13
  106. #define GRAY256_DITHER 14
  107. #define PPM_DITHER     15
  108. #define FULL_COLOR2_DITHER 16
  109. #define GRAY2_DITHER 17
  110. #define GRAY2562_DITHER 18
  111.  
  112. #define IS_2x2_DITHER(a) ((a) == Twox2_DITHER || (a) == FULL_COLOR2_DITHER || (a) == GRAY2_DITHER || (a) == (GRAY2562_DITHER))
  113.  
  114. /* External declaration of row,col to zig zag conversion matrix. */
  115.  
  116. extern int scan[][8];
  117.  
  118. /* Temporary definition of time stamp structure. */
  119.  
  120. typedef int TimeStamp;
  121.  
  122. /* Structure with reconstructed pixel values. */
  123.  
  124. typedef struct pict_image {
  125.   unsigned char *luminance;              /* Luminance plane.   */
  126.   unsigned char *Cr;                     /* Cr plane.          */
  127.   unsigned char *Cb;                     /* Cb plane.          */
  128.   unsigned char *display;                /* Display plane.     */
  129.   int locked;                            /* Lock flag.         */
  130.   TimeStamp show_time;                   /* Presentation time. */
  131.  
  132. #ifdef SH_MEM
  133.   XShmSegmentInfo shminfo;               /* Segment info.  */
  134.   XImage *ximage;                        /* Ximage struct. */
  135. #endif
  136.  
  137. } PictImage;
  138.  
  139. /* Group of pictures structure. */
  140.  
  141. typedef struct GoP {
  142.   BOOLEAN drop_flag;                     /* Flag indicating dropped frame. */
  143.   unsigned int tc_hours;                 /* Hour component of time code.   */
  144.   unsigned int tc_minutes;               /* Minute component of time code. */
  145.   unsigned int tc_seconds;               /* Second component of time code. */
  146.   unsigned int tc_pictures;              /* Picture counter of time code.  */
  147.   BOOLEAN closed_gop;                    /* Indicates no pred. vectors to
  148.                         previous group of pictures.    */
  149.   BOOLEAN broken_link;                   /* B frame unable to be decoded.  */
  150.   char *ext_data;                        /* Extension data.                */
  151.   char *user_data;                       /* User data.                     */
  152. } GoP;
  153.  
  154. /* Picture structure. */
  155.  
  156. typedef struct pict {
  157.   unsigned int temp_ref;                 /* Temporal reference.             */
  158.   unsigned int code_type;                /* Frame type: P, B, I             */
  159.   unsigned int vbv_delay;                /* Buffer delay.                   */
  160.   BOOLEAN full_pel_forw_vector;          /* Forw. vectors specified in full
  161.                         pixel values flag.              */
  162.   unsigned int forw_r_size;              /* Used for vector decoding.       */
  163.   unsigned int forw_f;                   /* Used for vector decoding.       */
  164.   BOOLEAN full_pel_back_vector;          /* Back vectors specified in full 
  165.                         pixel values flag.              */
  166.   unsigned int back_r_size;              /* Used in decoding.               */
  167.   unsigned int back_f;                   /* Used in decoding.               */
  168.   char *extra_info;                      /* Extra bit picture info.         */
  169.   char *ext_data;                        /* Extension data.                 */
  170.   char *user_data;                       /* User data.                      */
  171. } Pict;
  172.  
  173. /* Slice structure. */
  174.  
  175. typedef struct slice {
  176.   unsigned int vert_pos;                 /* Vertical position of slice. */
  177.   unsigned int quant_scale;              /* Quantization scale.         */
  178.   char *extra_info;                      /* Extra bit slice info.       */
  179. } Slice;
  180.  
  181. /* Macroblock structure. */
  182.  
  183. typedef struct macroblock {
  184.   int mb_address;                        /* Macroblock address.              */
  185.   int past_mb_addr;                      /* Previous mblock address.         */
  186.   int motion_h_forw_code;                /* Forw. horiz. motion vector code. */
  187.   unsigned int motion_h_forw_r;          /* Used in decoding vectors.        */
  188.   int motion_v_forw_code;                /* Forw. vert. motion vector code.  */
  189.   unsigned int motion_v_forw_r;          /* Used in decdoinge vectors.       */
  190.   int motion_h_back_code;                /* Back horiz. motion vector code.  */
  191.   unsigned int motion_h_back_r;          /* Used in decoding vectors.        */
  192.   int motion_v_back_code;                /* Back vert. motion vector code.   */
  193.   unsigned int motion_v_back_r;          /* Used in decoding vectors.        */
  194.   unsigned int cbp;                      /* Coded block pattern.             */
  195.   BOOLEAN mb_intra;                      /* Intracoded mblock flag.          */
  196.   BOOLEAN bpict_past_forw;               /* Past B frame forw. vector flag.  */
  197.   BOOLEAN bpict_past_back;               /* Past B frame back vector flag.   */
  198.   int past_intra_addr;                   /* Addr of last intracoded mblock.  */
  199.   int recon_right_for_prev;              /* Past right forw. vector.         */
  200.   int recon_down_for_prev;               /* Past down forw. vector.          */
  201.   int recon_right_back_prev;             /* Past right back vector.          */
  202.   int recon_down_back_prev;              /* Past down back vector.           */
  203. } Macroblock;
  204.  
  205. /* Block structure. */
  206.  
  207. typedef struct block {
  208.   short int dct_recon[8][8];             /* Reconstructed dct coeff matrix. */
  209.   short int dct_dc_y_past;               /* Past lum. dc dct coefficient.   */
  210.   short int dct_dc_cr_past;              /* Past cr dc dct coefficient.     */
  211.   short int dct_dc_cb_past;              /* Past cb dc dct coefficient.     */
  212. } Block;
  213.  
  214. /* Video stream structure. */
  215.  
  216. typedef struct vid_stream {
  217.   unsigned int h_size;                         /* Horiz. size in pixels.     */
  218.   unsigned int v_size;                         /* Vert. size in pixels.      */
  219.   unsigned int mb_height;                      /* Vert. size in mblocks.     */
  220.   unsigned int mb_width;                       /* Horiz. size in mblocks.    */
  221.   unsigned char aspect_ratio;                  /* Code for aspect ratio.     */
  222.   unsigned char picture_rate;                  /* Code for picture rate.     */
  223.   unsigned int bit_rate;                       /* Bit rate.                  */
  224.   unsigned int vbv_buffer_size;                /* Minimum buffer size.       */
  225.   BOOLEAN const_param_flag;                    /* Contrained parameter flag. */
  226.   unsigned char intra_quant_matrix[8][8];      /* Quantization matrix for
  227.                           intracoded frames.         */
  228.   unsigned char non_intra_quant_matrix[8][8];  /* Quanitization matrix for 
  229.                           non intracoded frames.     */
  230.   char *ext_data;                              /* Extension data.            */
  231.   char *user_data;                             /* User data.                 */
  232.   GoP group;                                   /* Current group of pict.     */
  233.   Pict picture;                                /* Current picture.           */
  234.   Slice slice;                                 /* Current slice.             */
  235.   Macroblock mblock;                           /* Current macroblock.        */
  236.   Block block;                                 /* Current block.             */
  237.   int state;                                   /* State of decoding.         */
  238.   int bit_offset;                              /* Bit offset in stream.      */
  239.   unsigned int *buffer;                        /* Pointer to next byte in
  240.                           buffer.                    */
  241.   int buf_length;                              /* Length of remaining buffer.*/
  242.   unsigned int *buf_start;                     /* Pointer to buffer start.   */
  243.   int max_buf_length;                          /* Max lenght of buffer.      */
  244.   PictImage *past;                             /* Past predictive frame.     */
  245.   PictImage *future;                           /* Future predictive frame.   */
  246.   PictImage *current;                          /* Current frame.             */
  247.   PictImage *ring[RING_BUF_SIZE];              /* Ring buffer of frames.     */
  248. } VidStream;   
  249.  
  250. /* Declaration of global pointer to current video stream. */
  251.  
  252. extern VidStream *curVidStream;
  253.  
  254. /* Declaration of global display pointer. */
  255. extern Display *display;
  256.  
  257. /* Shared memory flag. */
  258. extern int shmemFlag;
  259.  
  260. /* Quiet mode flag. */
  261. extern int quietFlag;
  262.  
  263. /* Own Colormap mode flag. */
  264. extern int owncmFlag;
  265.  
  266. /* Dither flags external declaration. */
  267. extern char *ditherFlags;
  268.  
  269. /* Flag controlling the "Press return" prompt */
  270. extern int requireKeypressFlag;
  271.  
  272. /* Flag controlling speed vs. quality */
  273. extern int qualityFlag;
  274.  
  275. /* Gamma correction stuff */
  276. extern int gammaCorrectFlag;
  277. extern double gammaCorrect;
  278.  
  279. /* Definition of Contant integer scale factor. */
  280.  
  281. #define CONST_BITS 13
  282.  
  283. /* Misc DCT definitions */
  284. #define DCTSIZE        8    /* The basic DCT block is 8x8 samples */
  285. #define DCTSIZE2    64    /* DCTSIZE squared; # of elements in a block */
  286.  
  287. #define GLOBAL            /* a function referenced thru EXTERNs */
  288.   
  289. typedef short DCTELEM;
  290. typedef DCTELEM DCTBLOCK[DCTSIZE2];
  291.  
  292.  
  293. #ifdef SH_MEM
  294. extern int gXErrorFlag;
  295. #endif
  296.  
  297. extern double realTimeStart;
  298. extern int totNumFrames;
  299. extern int loopFlag;
  300. extern int noDisplayFlag;
  301. extern jmp_buf env;
  302. extern int partialFlag, startFrame, endFrame;
  303.  
  304. #ifdef ANALYSIS
  305. extern unsigned int bitCount;
  306. extern int showEachFlag;
  307. extern unsigned int cacheHit[8][8];
  308. extern unsigned int cacheMiss[8][8];
  309. #endif
  310.  
  311. #if !defined(__MIPSEL__) && (defined(MIPSEL) || defined(__MIPSEL) || defined(__MIPSEL__) || defined(__mipsel) || defined(__mipsel__))
  312. #define __MIPSEL__ 1
  313. #endif
  314.  
  315. #if !defined(__MIPSEB__) && (defined(MIPSEB) || defined(__MIPSEB) || defined(__MIPSEB__) || defined(__mipseb) || defined(__mipseb__))
  316. #define __MIPSEB__ 1
  317. #endif
  318.  
  319. #if !defined(__SPARC__) && (defined(SPARC) || defined(__SPARC) || defined(__SPARC__) || defined(__sparc) || defined(__sparc__))
  320. #define __SPARC__ 1
  321. #endif
  322.  
  323. #if !defined(__alpha__) && (defined(ALPHA) || defined(__ALPHA) || defined(__ALPHA__) || defined(__alpha))
  324. #define __alpha__ 1
  325. #endif
  326.  
  327. #if !defined(__680x0__) && (defined(__680x0) || defined(__680x0__))
  328. #define __680x0__ 1
  329. #endif
  330.  
  331. #if !defined(__AIX__) && (defined(AIX) || defined(_AIX) || defined(__AIX) || defined(__AIX__))
  332. #define __AIX__ 1
  333. #endif
  334.  
  335. #if !defined(__RS6000__) && (defined(__AIX__) || defined(RS6000) || defined(_RS6000) || defined(__RS6000) || defined(__RS6000__))
  336. #define __RS6000__ 1
  337. #endif
  338.  
  339. #if !defined(__HPUX__) && (defined(HPUX) || defined(_HPUX) || defined(__HPUX) || defined(__HPUX__))
  340. #define __HPUX__ 1
  341. #endif
  342. #if !defined(__HPUX__) && (defined(hpux) || defined(_hpux) || defined(__hpux) || defined(__hpux__))
  343. #define __HPUX__ 1
  344. #endif
  345.  
  346. #if !defined(__VAX__) && (defined(VAX) || defined (__VAX))
  347. #define __VAX__ 1
  348. #endif
  349.  
  350. #if !defined(__SCO__) && (defined(SCO) || defined(__SCO) || defined(sco) || defined(__sco__))
  351. #define __SCO__ 1
  352. #endif
  353.  
  354. #if defined(__i386__) || defined(__VAX__) || defined(__MIPSEL__) || defined(__alpha__) || defined(__SCO__)
  355. #undef  BIG_ENDIAN_ARCHITECTURE
  356. #define LITTLE_ENDIAN_ARCHITECTURE 1
  357. #endif
  358.  
  359. #if defined(__RS6000__) || defined(__SPARC__) || defined(__680x0__) || defined(__HPUX__) || defined(__MIPSEB__)
  360. #undef  LITTLE_ENDIAN_ARCHITECTURE
  361. #define BIG_ENDIAN_ARCHITECTURE 1
  362. #endif
  363.  
  364. #if !defined(LITTLE_ENDIAN_ARCHITECTURE) && !defined(BIG_ENDIAN_ARCHITECTURE)
  365. Error: Unknown endianism of architecture
  366. #endif
  367.  
  368. #ifdef __alpha__
  369. #define SIXTYFOUR_BIT
  370. #endif
  371.